package cn.iocoder.boot.kmeans;

import java.util.ArrayList;
import java.util.List;

public class Cluster {
    private List<Talent> talents = new ArrayList<>(); // 簇中的候选人才
    private Talent centroid;                         // 簇中心

    // 获取簇中的候选人才列表
    public List<Talent> getTalents() {
        return talents;
    }

    // 获取簇中心
    public Talent getCentroid() {
        return centroid;
    }

    // 设置簇中心
    public void setCentroid(Talent centroid) {
        this.centroid = centroid;
    }

    // 添加人才到簇中
    public void addTalent(Talent talent) {
        talents.add(talent);
    }

    // 更新簇中心，通过计算簇中所有人才特征的均值来确定新的簇中心
    public void updateCentroid() {
        if (talents.isEmpty()) return;

        double[] newCentroidFeatures = new double[centroid.getFeatures().length];
        // 累加每个特征的值
        for (Talent talent : talents) {
            for (int i = 0; i < talent.getFeatures().length; i++) {
                newCentroidFeatures[i] += talent.getFeatures()[i];
            }
        }
        // 计算每个特征的平均值，作为新簇中心的特征值
        for (int i = 0; i < newCentroidFeatures.length; i++) {
            newCentroidFeatures[i] /= talents.size();
        }
        // 创建新的簇中心对象，这里将特征值转为整数
        int[] centroidFeaturesInt = new int[newCentroidFeatures.length];
        for (int i = 0; i < newCentroidFeatures.length; i++) {
            centroidFeaturesInt[i] = (int) Math.round(newCentroidFeatures[i]);
        }
        centroid = new Talent("Centroid", centroidFeaturesInt, 0); // 聚类中心的薪资设置为0，因为它不参与聚类计算
    }
}